/**
 * 列表统一接口调用
 * @param fn 调用api的方法
 * @param callback 回调方法,非必填
 */
export function list(self, fn, callback) {
  self.listLoading = true
  fn(self.queryParams).then(response => {
    self.list = response.data.records
    self.total = response.data.total
    self.listLoading = false
    if (callback instanceof Function) {
      callback()
    }
  })
}

/**
 * 获取详情
 * @param fn 调用api的方法
 * @param callback 回调方法,非必填
 */
export function getDetailById(self, fn, callback) {
  if (self.optType !== 1) {
    const id = self.$route.params && self.$route.params.id
    if (self.formData) {
      self.formData.id = id
    }
    console.log("detail详情id", id)
    if (id) {
      fn(id).then((response) => {
        if (callback instanceof Function) {
          callback(response.data);
        }
      })
    }
  }
}


/**
 * 已经知道这个操作是保存还是更新,只需要传入save或update方法
 * @param self 当前界面this
 * @param apiCall 引入的api接口的save或update方法
 * @param cb 提交后操作，2种方式>1，传入(function)一个执行方法。2，传入一个(string)跳转路由的的名字router-name
 * @param formName 自定义表单名称，默认为：formData
 */
export function saveOne(self, apiCall, cb, formName) {
  if (!formName) {
    formName = 'formData'
  }
  self.$refs[formName].validate(valid => {
    if (valid) {
      if (self.loading === false) {
        self.loading = true;
      }
      try {
        apiCall(self[formName]).then(response => {
          const resData = response.data
          console.log('更新后返回结果:', resData)
          if (cb instanceof Function) {
            cb(response)
          } else {
            self.$router.replace({name: cb})
          }
          if (self.loading === true) {
            self.loading = false;
          }
        })
      } catch (e) {
        console.log('全局保存报错：' + e)
      }
    }
  })
}

/**
 * 在一个js文件中既有保存功能又有修改功能
 * 2个方法保存和修改方法都传入,自动判断是更新还是新增
 * 表单form的名字name必须是:formData
 * @param self 当前界面this
 * @param save 引入的api接口service的save方法
 * @param update 引入的api接口service的update方法
 * @param data  提交的form表单数据
 * @param cb 提交后操作，2种方式>1，传入(function)一个执行方法。2，传入一个(string)跳转路由的的名字router-name
 */
export function save(self, save, update, cb) {
  self.$refs.formData.validate(valid => {
    if (valid) {
      if (self.loading === false) {
        self.loading = true;
      }
      try {
        if (self.optType === 1) {
          save(self.formData).then(response => {
            const resData = response.data
            console.log('保存后返回结果:' + resData)
            if (response.code === 0) {
              if (cb instanceof Function) {
                cb()
              } else {
                self.$router.replace({name: cb})
              }
            }
            if (self.loading === true) {
              self.loading = false;
            }
          })
        } else {
          update(self.formData).then(response => {
            const resData = response.data
            console.log('更新后返回结果:' + resData)
            if (response.code === 0) {
              if (cb instanceof Function) {
                cb()
              } else {
                self.$router.replace({name: cb})
              }
            }
            if (self.loading === true) {
              self.loading = false;
            }
          })
        }
      } catch (e) {
        console.log('通用保存报错：' + e)
      }
    }
  })
}

/**
 * 确认删除弹框
 * @param self 当前界面this
 * @param message 提示信息
 * @param data  删除数据的id
 * @param remove  api删除方法
 * @param cb 提交后操作，2种方式>1，传入(function)一个执行方法。2，传入一个(string)跳转路由的的名字router-name
 */
export function deleteConfirm(self, message, data, remove, cb) {
  try {
    self.$confirm(message + ',是否继续?', '提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    }).then((action) => {
      if (action == 'confirm') {
        remove(data).then(response => {
          if (response.code == 0) {
            self.$message({
              type: 'success',
              message: '删除成功'
            })
            if (cb instanceof Function) {
              cb()
            } else {
              self.$router.push({name: cb})
            }
          }
        })
      }
    }).catch(() => {
      self.$message({
        type: 'info',
        message: '已取消删除'
      })
    })
  } catch (e) {
    console.log('通用删除报错：' + e)
  }
}

/**
 * 校验唯一性
 * @param rule 固定参数 位置不可变
 * @param obj 自定义传参对象
 * @param callback 固定参数 位置不可变
 * @param exist api校验唯一函数
 */
export function exist(rule, obj, callback, exist) {
  if (obj.oldName != obj[obj.key]) {
    exist(obj).then(response => {
      if (response.data) {
        callback(new Error(obj.message))
      } else {
        callback()
      }
    })
  } else {
    callback()
  }
}
